package com.xxkfz.shedlock;

import net.javacrumbs.shedlock.spring.annotation.SchedulerLock;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;

import java.text.SimpleDateFormat;
import java.util.Date;

/**
 https://blog.csdn.net/dot_life/article/details/143895678

 @Scheduled：支持cron格式，"0 0/2 * * * ?" 意味着“每2分钟”。

 @SchedulerLock，name参数必须是唯一的，ClassName_methodName通常足以实现它。我们不希望同时有多个相同名称方法运行，所以ShedLock使用唯一名称来实现该目的。

 llockAtLeastForString，以便我们可以在方法调用之间产生时间间隔。“PT3M”表示此方法至少可以锁定3分钟。这意味着这种方法可以由ShedLock运行，频率间隔不超过三分钟运行一次。也就是至少需要每4分钟运行一次

 lockAtMostForString用来指定在执行节点终止后应该保留多长时间。使用“PT14M”意味着它将被锁定不超过14分钟。

 在正常情况下，任务完成后，ShedLock会在任务完成后直接释放锁，这里，我们不需要这样做，因为在@EnableSchedulerLock中提供了一个默认值，但我们选择在这里重写它。

 */
@Component
public class ShedlockTaskScheduler {

    @Scheduled(cron = "0/10 * * * * ?")
    @SchedulerLock(name = "TaskScheduler_scheduledTask",
            lockAtLeastFor = "PT3M", lockAtMostFor = "PT14M")
    public void scheduledTask1() {
        SimpleDateFormat date = new SimpleDateFormat("yyyy年MM月dd日：HH:mm:ss---SSS(毫秒)");
        String format = date.format(new Date(System.currentTimeMillis()));
        System.out.println(format + "：hello one，1!");
    }

    @Scheduled(cron = "0/10 * * * * ?")
    @SchedulerLock(name = "TaskScheduler_scheduledTask",
            lockAtLeastFor = "PT1S", lockAtMostFor = "PT1M")
    public void scheduledTask2() {
        SimpleDateFormat date = new SimpleDateFormat("yyyy年MM月dd日：HH:mm:ss---SSS(毫秒)");
        String format = date.format(new Date(System.currentTimeMillis()));
        System.out.println(format + "：hello two，2!");
    }
}